home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
v10n20.arc
/
SINEWAVE.ARC
/
SINEWAVE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-28
|
11KB
|
283 lines
/*------------------------------------------------------
SINEWAVE.C -- Multimedia Windows Sine Wave Generator
(c) Charles Petzold, 1991
------------------------------------------------------*/
#include <windows.h>
#include <mmsystem.h>
#include <math.h>
#include "sinewave.h"
#define SAMPLE_RATE 11025
#define FREQ_MIN 20
#define FREQ_MAX 5000
#define FREQ_INIT 440
#define BUFFER_SIZE 2048
#define SINE_TABLE_SIZE 2048
#define PI 3.14159
#define GlobalShareAlloc(dwSize) GlobalAlloc (GHND | GMEM_SHARE, dwSize)
BOOL FAR PASCAL DlgProc (HWND, WORD, WORD, LONG) ;
static char szAppName [] = "SineWave" ;
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
FARPROC lpDlgProc ;
lpDlgProc = MakeProcInstance (DlgProc, hInstance) ;
DialogBox (hInstance, szAppName, NULL, lpDlgProc) ;
FreeProcInstance (lpDlgProc) ;
return 0 ;
}
VOID FillBuffer (LPBYTE pBuffer, int iFreq)
{
static BOOL bSineTableSet ;
static BYTE bySineTable [SINE_TABLE_SIZE] ;
static DWORD dwAngle ;
int i ;
if (!bSineTableSet)
{
for (i = 0 ; i < SINE_TABLE_SIZE ; i++)
bySineTable [i] = (BYTE) (127 + 127 *
sin (i * 2 * PI / SINE_TABLE_SIZE)) ;
bSineTableSet = TRUE ;
}
for (i = 0 ; i < BUFFER_SIZE ; i++)
{
pBuffer [i] = bySineTable [dwAngle >> 8] ;
dwAngle += 256UL * SINE_TABLE_SIZE * iFreq / SAMPLE_RATE ;
if (dwAngle > 256L * SINE_TABLE_SIZE)
dwAngle -= 256L * SINE_TABLE_SIZE ;
}
}
BOOL FAR PASCAL DlgProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
static BOOL bShutOff, bClosing ;
static char szOpenError[] = { "Error opening waveform audio!" } ;
static char szMemError [] = { "Error allocating memory!" } ;
static GLOBALHANDLE hWaveHdr, hBuffer, hBuffer2 ;
static HWAVEOUT hWaveOut ;
static HWND hwndScroll ;
static int iFreq = FREQ_INIT ;
static LPBYTE pBuffer, pBuffer2 ;
static LPWAVEHDR pWaveHdr ;
static PCMWAVEFORMAT pcm ;
int iDummy ;
LPBYTE pSwap ;
switch (message)
{
case WM_INITDIALOG:
hwndScroll = GetDlgItem (hwnd, ID_SCROLL) ;
SetScrollRange (hwndScroll, SB_CTL, FREQ_MIN, FREQ_MAX, FALSE) ;
SetScrollPos (hwndScroll, SB_CTL, FREQ_INIT, TRUE) ;
SetDlgItemInt (hwnd, ID_TEXT, FREQ_INIT, FALSE) ;
return TRUE ;
case WM_HSCROLL:
switch (wParam)
{
case SB_LINEUP: iFreq -= 1 ; break ;
case SB_LINEDOWN: iFreq += 1 ; break ;
case SB_PAGEUP: iFreq /= 2 ; break ;
case SB_PAGEDOWN: iFreq *= 2 ; break ;
case SB_THUMBTRACK:
iFreq = LOWORD (lParam) ;
break ;
case SB_TOP:
GetScrollRange (hwndScroll, SB_CTL, &iFreq, &iDummy) ;
break ;
case SB_BOTTOM:
GetScrollRange (hwndScroll, SB_CTL, &iDummy, &iFreq) ;
break ;
}
iFreq = max (FREQ_MIN, min (FREQ_MAX, iFreq)) ;
SetScrollPos (hwndScroll, SB_CTL, iFreq, TRUE) ;
SetDlgItemInt (hwnd, ID_TEXT, iFreq, FALSE) ;
return TRUE ;
case WM_COMMAND:
switch (wParam)
{
case ID_ONOFF:
if (hWaveOut == NULL)
{
// Allocate header and buffer memory
hWaveHdr = GlobalShareAlloc (sizeof (WAVEHDR)) ;
if (hWaveHdr == NULL)
{
MessageBeep (MB_ICONEXCLAMATION) ;
MessageBox (hwnd, szMemError, szAppName,
MB_ICONEXCLAMATION | MB_OK) ;
return TRUE ;
}
hBuffer = GlobalShareAlloc (BUFFER_SIZE) ;
if (hBuffer == NULL)
{
GlobalFree (hWaveHdr) ;
MessageBeep (MB_ICONEXCLAMATION) ;
MessageBox (hwnd, szMemError, szAppName,
MB_ICONEXCLAMATION | MB_OK) ;
return TRUE ;
}
hBuffer2 = GlobalShareAlloc (BUFFER_SIZE) ;
if (hBuffer2 == NULL)
{
GlobalFree (hWaveHdr) ;
GlobalFree (hBuffer) ;
MessageBeep (MB_ICONEXCLAMATION) ;
MessageBox (hwnd, szMemError, szAppName,
MB_ICONEXCLAMATION | MB_OK) ;
return TRUE ;
}
pWaveHdr = (LPWAVEHDR) GlobalLock (hWaveHdr) ;
pBuffer = (LPBYTE) GlobalLock (hBuffer) ;
pBuffer2 = (LPBYTE) GlobalLock (hBuffer2) ;
bShutOff = FALSE ;
// Open waveform audio for output
pcm.wf.wFormatTag = WAVE_FORMAT_PCM ;
pcm.wf.nChannels = 1 ;
pcm.wf.nSamplesPerSec = SAMPLE_RATE ;
pcm.wf.nAvgBytesPerSec = SAMPLE_RATE ;
pcm.wf.nBlockAlign = 1 ;
pcm.wBitsPerSample = 8 ;
if (waveOutOpen (&hWaveOut, 0, &pcm.wf,
hwnd, 0L, CALLBACK_WINDOW))
{
GlobalUnlock (hWaveHdr) ;
GlobalUnlock (hBuffer) ;
GlobalUnlock (hBuffer2) ;
GlobalFree (hWaveHdr) ;
GlobalFree (hBuffer) ;
GlobalFree (hBuffer2) ;
hWaveOut = NULL ;
MessageBeep (MB_ICONEXCLAMATION) ;
MessageBox (hwnd, szOpenError, szAppName,
MB_ICONEXCLAMATION | MB_OK) ;
}
}
// Close waveform audio
else
{
bShutOff = TRUE ;
waveOutReset (hWaveOut) ;
}
return TRUE ;
}
break ;
case MM_WOM_OPEN:
SetDlgItemText (hwnd, ID_ONOFF, "Turn Off") ;
FillBuffer (pBuffer, iFreq) ;
pWaveHdr->lpData = pBuffer ;
pWaveHdr->dwBufferLength = BUFFER_SIZE ;
pWaveHdr->dwBytesRecorded = 0L ;
pWaveHdr->dwUser = 0L ;
pWaveHdr->dwFlags = 0L ;
pWaveHdr->dwLoops = 1L ;
pWaveHdr->lpNext = NULL ;
pWaveHdr->reserved = 0L ;
waveOutPrepareHeader (hWaveOut, pWaveHdr, sizeof (WAVEHDR)) ;
waveOutWrite (hWaveOut, pWaveHdr, sizeof (WAVEHDR)) ;
FillBuffer (pBuffer2, iFreq) ;
return TRUE ;
case MM_WOM_DONE:
waveOutUnprepareHeader (hWaveOut, pWaveHdr, sizeof (WAVEHDR)) ;
if (bShutOff)
{
waveOutClose (hWaveOut) ;
return TRUE ;
}
pSwap = pBuffer ;
pBuffer = pBuffer2 ;
pBuffer2 = pSwap ;
pWaveHdr->lpData = pBuffer ;
pWaveHdr->dwBufferLength = BUFFER_SIZE ;
pWaveHdr->dwBytesRecorded = 0L ;
pWaveHdr->dwUser = 0L ;
pWaveHdr->dwFlags = 0L ;
pWaveHdr->dwLoops = 1L ;
pWaveHdr->lpNext = NULL ;
pWaveHdr->reserved = 0L ;
waveOutPrepareHeader (hWaveOut, pWaveHdr, sizeof (WAVEHDR)) ;
waveOutWrite (hWaveOut, pWaveHdr, sizeof (WAVEHDR)) ;
FillBuffer (pBuffer2, iFreq) ;
return TRUE ;
case MM_WOM_CLOSE:
GlobalUnlock (hWaveHdr) ;
GlobalFree (hWaveHdr) ;
GlobalUnlock (hBuffer) ;
GlobalFree (hBuffer) ;
GlobalUnlock (hBuffer2) ;
GlobalFree (hBuffer2) ;
hWaveOut = NULL ;
SetDlgItemText (hwnd, ID_ONOFF, "Turn On") ;
if (bClosing)
EndDialog (hwnd, 0) ;
return TRUE ;
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_CLOSE:
if (hWaveOut != NULL)
{
bShutOff = TRUE ;
bClosing = TRUE ;
waveOutReset (hWaveOut) ;
}
else
EndDialog (hwnd, 0) ;
return TRUE ;
}
break ;
}
return FALSE ;
}